﻿#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<assert.h>
using namespace std;
int main1()
{
	int a = 0;
	// 引⽤：b和c是a的别名 
	int& b = a;
	int& c = a;
	// 也可以给别名b取别名，d相当于还是a的别名 
	int& d = b;
	++d;
	// 这⾥取地址我们看到是⼀样的 
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;
	return 0;
}
int main2()
{
	int a = 10;

	// 编译报错：“ra”: 必须初始化引⽤ 
	//int& ra;
	int& b = a;
	int c = 20;
	// 这⾥并⾮让b引⽤c，因为C++引⽤不能改变指向， 
	// 这⾥是⼀个赋值 
	b = c;
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	return 0;
}
void Swap(int& rx, int& ry)
{
	int tmp = rx;
	rx = ry;
	ry = tmp;
}
int main3()
{
	int x = 0, y = 1;
	cout << x << " " << y << endl;
	Swap(x, y);
	cout << x << " " << y << endl;
	return 0;
}
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
void STInit(ST& rs, int n = 4)
{
	rs.a = (STDataType*)malloc(n * sizeof(STDataType));
	rs.top = 0;
	rs.capacity = n;
}
// 栈顶 
void STPush(ST& rs, STDataType x)
{
	assert(ps);
	// 满了， 扩容 
	if (rs.top == rs.capacity)
	{
		printf("扩容\n");
		int newcapacity = rs.capacity == 0 ? 4 : rs.capacity * 2;
		STDataType* tmp = (STDataType*)realloc(rs.a, newcapacity *
			sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		rs.a = tmp;
		rs.capacity = newcapacity;
	}
	rs.a[rs.top] = x;
	rs.top++;
}
// int STTop(ST& rs)
int& STTop(ST& rs)
{
	assert(rs.top > 0);
	return rs.a[rs.top];
}
int main()
{
	// 调⽤全局的 
	ST st1;
	STInit(st1);
	STPush(st1, 1);
	STPush(st1, 2);
	cout << STTop(st1) << endl;
	STTop(st1) += 10;
	cout << STTop(st1) << endl;
	return 0;
}

int main()
{
	const int a = 10;
	// 编译报错：error C2440: “初始化”: ⽆法从“const int”转换为“int &” 
	// 这⾥的引⽤是对a访问权限的放⼤ 
	//int& ra = a;
	// 这样才可以 
	const int& ra = a;
	// 编译报错：error C3892: “ra”: 不能给常量赋值 
	//ra++;
	// 这⾥的引⽤是对b访问权限的缩⼩ 
	int b = 20;
	const int& rb = b;
	// 编译报错：error C3892: “rb”: 不能给常量赋值 
	//rb++;
	return 0;
}

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	const int& ra = 30;

	// 编译报错: “初始化”: ⽆法从“int”转换为“int &” 
	// int& rb = a * 3;
	const int& rb = a * 3;
	double d = 12.34;
	// 编译报错：“初始化”: ⽆法从“double”转换为“int &” 
	// int& rd = d;
	const int& rd = d;
	return 0;
}

#include<iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);
	// 本想通过f(NULL)调⽤指针版本的f(int*)函数，但是由于NULL被定义成0，调⽤了f(int x)，因此与程序的初衷相悖。
	f(NULL);
	f((int*)NULL);
	// 编译报错：error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型 
	// f((void*)NULL);

	f(nullptr);
	return 0;
}
